Handle variadic macros in a portable way
authorMartin Nordholts <martinn@src.gnome.org>
Wed, 25 Mar 2009 19:02:35 +0000 (19:02 +0000)
committerMartin Nordholts <martinn@src.gnome.org>
Wed, 25 Mar 2009 19:02:35 +0000 (19:02 +0000)
Apply patch from Gary V. Vaughan that adds configure time checks for
variadic macros and adapts the definitions of such macros in-code
accordingly so that babl can be compiled on more platforms.

svn path=/trunk/; revision=400

ChangeLog
acinclude.m4
babl/babl-internal.h
configure.ac

index 7aae42c0272e17a3b5dec813200a0e45388614c3..b8d3840790d66291e0a0ada3377fb9c41f47d64d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2009-03-25  Martin Nordholts  <martinn@svn.gnome.org>
 
+       Apply patch from Gary V. Vaughan that adds configure time checks
+       for variadic macros and adapts the definitions of such macros
+       in-code accordingly so that babl can be compiled on more
+       platforms.
+
+       * acinclude.m4
+       * babl/babl-internal.h
+       * configure.ac
+
+2009-03-25  Martin Nordholts  <martinn@svn.gnome.org>
        * babl/babl-fish.c: Patch from Gary V. Vaughan. Some vendor
        compilers can't compile non-constant elements of compound struct
        initializers
index 3fad630b637c88b48be9c2429a5d75638903e085..4ea58bdfdac33e299afb1a4728a8d75197041b45 100644 (file)
@@ -18,3 +18,65 @@ AC_DEFUN([BABL_DETECT_CFLAGS],
     fi
   done
 ])
+
+
+# BABL_VARIADIC_MACROS
+# --------------------
+# check for flavours of variadic macros
+AC_DEFUN([BABL_VARIADIC_MACROS],
+[AC_BEFORE([$0], [AC_PROG_CXX])
+AC_REQUIRE([AC_PROG_CPP])
+AC_CACHE_CHECK([for GNUC variadic macros],
+    [babl_cv_prog_gnuc_variadic_macros],
+    [# gcc-2.95.x supports both gnu style and ISO varargs, but if -ansi
+    # is passed ISO vararg support is turned off, and there is no work
+    # around to turn it on, so we unconditionally turn it off.
+    { echo '#if __GNUC__ == 2 && __GNUC_MINOR__ == 95'
+      echo ' yes '
+      echo '#endif'; } > conftest.c
+    if ${CPP} conftest.c | grep yes > /dev/null; then
+        babl_cv_prog_c_variadic_macros=no
+        babl_cv_prog_cxx_variadic_macros=no
+    fi
+    AC_TRY_COMPILE([],[int a(int p1, int p2, int p3);
+#define call_a(params...) a(1,params)
+call_a(2,3);
+    ],
+        babl_cv_prog_gnuc_variadic_macros=yes,
+        babl_cv_prog_gnuc_variadic_macros=no)
+])
+if test x$babl_cv_prog_gnuc_variadic_macros = xyes; then
+  AC_DEFINE(BABL_GNUC_VARIADIC_MACROS, 1, [Define if the C pre-processor supports GNU style variadic macros])
+fi
+
+AC_CACHE_CHECK([for ISO C99 variadic macros in C],
+    [babl_cv_prog_c_variadic_macros],
+    [AC_TRY_COMPILE([],[int a(int p1, int p2, int p3);
+#define call_a(...) a(1,__VA_ARGS__)
+call_a(2,3);
+        ],
+        babl_cv_prog_c_variadic_macros=yes,
+        babl_cv_prog_c_variadic_macros=no)
+])
+if test x$babl_cv_prog_c_variadic_macros = xyes ; then
+  AC_DEFINE(BABL_ISO_VARIADIC_MACROS, 1, [Define if the C pre-processor supports variadic macros])
+fi
+
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+    [AC_CACHE_CHECK([for ISO C99 variadic macros in C++],
+        [babl_cv_prog_cxx_variadic_macros],
+        [AC_LANG_PUSH(C++)
+        AC_TRY_COMPILE([],[int a(int p1, int p2, int p3);
+#define call_a(...) a(1,__VA_ARGS__)
+call_a(2,3);
+        ],
+        babl_cv_prog_cxx_variadic_macros=yes,
+        babl_cv_prog_cxx_variadic_macros=no)
+        AC_LANG_POP])],
+    [# No C++ compiler
+    babl_cv_prog_cxx_variadic_macros=no])
+if test x$babl_cv_prog_cxx_variadic_macros = xyes ; then
+  AC_DEFINE(BABL_ISO_CXX_VARIADIC_MACROS, 1, [Define if the C++ pre-processor supports variadic macros])
+fi
+])
+
index a43bb7b433c6b9d51caa966f16c0fd8d32a2b232..a83e50665f2e38d3867dd63c4d4211a4f9c74c69 100644 (file)
@@ -162,19 +162,57 @@ real_babl_log (const char *file,
   hack_hack ();
 }
 
+#if defined(__cplusplus) && defined(BABL_ISO_CXX_VARIADIC_MACROS)
+#  define BABL_ISO_VARIADIC_MACROS 1
+#endif
+
+#if defined(BABL_ISO_VARIADIC_MACROS)
+
+#define babl_log(...)                                       \
+  real_babl_log(__FILE__, __LINE__, __func__, __VA_ARGS__)
+
+#define babl_fatal(...) do{                                \
+  real_babl_log(__FILE__, __LINE__, __func__, __VA_ARGS__); \
+  babl_die();}                                              \
+while(0)
+
+#elif defined(BABL_GNUC_VARIADIC_MACROS)
+
 #define babl_log(args...)                               \
   real_babl_log(__FILE__, __LINE__, __func__, args)
 
 #define babl_fatal(args...) do{                         \
-  real_babl_log(__FILE__, __LINE__, __func__, args);\
+  real_babl_log(__FILE__, __LINE__, __func__, args);    \
   babl_die();}                                          \
 while(0)
 
+#else
+
+static inline void
+babl_log (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  real_babl_log (__FILE__, __LINE__, __func__, format, args);
+  va_end (args);
+}
+static inline void
+babl_fatal (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  real_babl_log (__FILE__, __LINE__, __func__, format, args);
+  va_end (args);
+  babl_die();
+}
+
+#endif
+
 
 #define babl_assert(expr) do{                              \
   if(!(expr))                                              \
     {                                                      \
-      babl_fatal("Eeeeek! Assertion failed: `" #expr "`"); \
+      real_babl_log(__FILE__, __LINE__, __func__, "Eeeeek! Assertion failed: `" #expr "`"); \
       assert(expr);                                        \
     }                                                      \
 }while(0)
index a11306d96129ba2a091979caa28288015cd533e6..7d03255ff1b4502001c19a187ad8355ba011d526 100644 (file)
@@ -100,6 +100,8 @@ AM_MAINTAINER_MODE
 AC_STDC_HEADERS
 AM_SANITY_CHECK
 
+BABL_VARIADIC_MACROS
+
 WEBSITE_HOST=pippin.gimp.org
 AC_SUBST(WEBSITE_HOST)
 WEBSITE_LOCATION=public_html/babl/